package Classes_Conexao;
// importa pacotes e componentes necessarios para rodar recursos do java
import Classes.Recibo;
import Classes.Servico;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class ReciboDAO {
    // instanciando um atributo da classe ServicoDAO.

    private Connection connection;

    public ReciboDAO() throws SQLException {
        this.connection = Conexao.getConnection();
    }

    public void editar(Servico servico) {
        PreparedStatement comando;
        try {
            // consulta SQL que atualiza um dado da tabela de (os) do banco de dados passada pelo codigo do Serviço
            String sql = "UPDATE os SET status = ?, total = ?, tecnico = ?, dataHoraSaida = ? WHERE codigoServico = ?;";
            // chama a conexão
            comando = connection.prepareStatement(sql);
            comando.setString(1, servico.getStatus());
            comando.setDouble(2, servico.getTotal());
            comando.setString(3, servico.getTecnicoResponsavel());
            comando.setString(4, servico.getDataHSaida());
            comando.setInt(5,servico.getCodigoServico());
            // executa a Atualização
            comando.executeUpdate();
            // fecha o comando
            comando.close();
            // instancia de erro
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
    // adiciona a instancia no banco de dados!
    public void addServicoRealizado(Recibo recibo) throws SQLException {
        // fazendo a consulta SQL, para inserir os valores nas colunas da tabela (os) no banco de dados.
        String sql = "INSERT INTO servicorealizado (os_codigoServico, descricao, valorUnitario, quantidade, subtotal) VALUES (?,?,?,?,?)";
        // insere os dados do servico com a conexao para o banco de dados.
        PreparedStatement stmt = connection.prepareStatement(sql);
        // busca os campos preenchidos na classe de Servicos.
        stmt.setInt(1, recibo.getCodigoServico());
        stmt.setString(2, recibo.getDescrição());
        stmt.setDouble(3, recibo.getValorUnitario());
        stmt.setInt(4, recibo.getQuantidade());
        stmt.setDouble(5, recibo.getSubtotal());

        //executa e fecha o comando
        stmt.execute();
        stmt.close();
    }
    // metodo que retorna os serviços pelo tipo de status, para tabela no banco de dados.
    public ArrayList<Recibo> retornaServicoPorCodigo(int codigo) {
        PreparedStatement comando;
        ArrayList<Recibo> listaRecibo = new ArrayList<Recibo>();

        try {
            // consulta em SQL que retorna todos os registro da tabela (os) e da tabela clientes pelo status.
            String sql = "SELECT * FROM servicorealizado WHERE os_codigoServico LIKE ?";
            comando = connection.prepareStatement(sql);
            comando.setString(1, codigo + "%");
            ResultSet rs = comando.executeQuery(); // executeQuery é associado as operações de insert,delete,update.

            while (rs.next()) {
                // pega os registro que precisa para fazer a filtragem no banco de dados da tabela serviço.
                Recibo recibo = new Recibo();
                recibo.setDescrição(rs.getString("descricao"));
                recibo.setValorUnitario(rs.getDouble("valorUnitario"));
                recibo.setQuantidade(rs.getInt("quantidade"));
                recibo.setSubtotal(rs.getDouble("subtotal"));
                // adiciona todos os resultados na listaServico que é um arrayList.
                listaRecibo.add(recibo);
            }
            // fecha o comando
            comando.close();
            // retorna a listaServico;
            return listaRecibo;
            // instancia de erro.
        } catch (SQLException sqle) {
            sqle.printStackTrace();
            return null;
        }
    }
}
